package Model;

import java.util.Calendar;
import java.util.Date;

import Persistencia.AdministradorPersistenciaReserva;

public class Reserva {

	private int id;
	private Date fechainicio;
	private Date fechafin;
	private String estado;
	private Tipo tipo;
	private Cliente cliente;
	private Automovil auto;
	
	public Date getFechainicio() {
		return fechainicio;
	}
	public void setFechainicio(Date fechainicio) {
		this.fechainicio = fechainicio;
	}
	public int getId() {
		return id;
	}
	public Date getFechafin() {
		return fechafin;
	}
	public void setFechafin(Date fechafin) {
		this.fechafin = fechafin;
	}
	public String getEstado() {
		chequearVigencia();
		return estado;
	}
	public Tipo getTipo() {
		return tipo;
	}
	public Automovil getAutomovil() {
		return auto;
	}
	public void setAutomovil(Automovil auto) {
		this.auto = auto;
	}
	public Boolean estaActiva() {		
		return (this.estado.equals("Activa"));
	}
	public void setTipo(Tipo tipo) {
		this.tipo = tipo;
	}
	public Cliente getCliente() {
		return cliente;
	}
	public Reserva(Date fechainicio, Date fechafin, Tipo tipo, Cliente cliente, Automovil auto) {
		this.id=0;
		this.fechainicio = fechainicio;
		this.fechafin = fechafin;
		this.estado = "Activa";
		this.tipo = tipo;
		this.cliente = cliente;		
		this.auto = auto;
	}
	
	public Reserva(int id, Date fechainicio, Date fechafin, Tipo tipo, Cliente cliente, String estado) {
		this.id=id;
		this.fechainicio = fechainicio;
		this.fechafin = fechafin;
		this.estado = estado;
		this.tipo = tipo;
		this.cliente = cliente;		
		chequearVigencia();
	}
	public void setCliente(Cliente cliente) {
		this.cliente = cliente;
	}

	public void concretada() throws Exception {
		if (this.estaActiva())
		{
			this.estado = "Finalizada";
			AdministradorPersistenciaReserva.getInstancia().update(this);
		}
		else
		{
			throw new Exception("No puede confirmarse una reserva que no esta activa");
		}
	}
	public void cancelar() throws Exception {
		
		chequearVigencia();
		if (this.estaActiva())
		{
			Date d = new Date();
			
			if (this.fechainicio.before(d))
			{
				int dias = 0; 
	
		        long milisFI = this.fechainicio.getTime();
		        long milisFF = this.fechafin.getTime();
		
		        long diff = milisFF - milisFI;
		        dias = (int)diff / (24 * 60 * 60 * 1000);        
		        
				if(dias>2)
				{
					this.estado = "Cancelado";
				}
				else
				{
					throw new Exception("No puede cancelarse la reserva por la cercania a la fecha de servicio");
				}
				
				if (this.id>0)
				{
					AdministradorPersistenciaReserva.getInstancia().update(this);
				}
			}
			else
			{
				throw new Exception("No puede cancelarse la reserva por la cercania a la fecha de servicio");
			}
		}
		else
		{
			throw new Exception("No puede cancelarse una reserva que no esta activa");
		}		
	}
	public void save()
	{
		if (this.id==0)
		{
			this.id = AdministradorPersistenciaReserva.getInstancia().insert(this);
		}
		else
		{
			AdministradorPersistenciaReserva.getInstancia().update(this);
		}
	}
	public ReservaView getView()
	{					
		ReservaView res = new ReservaView( getId()
				, getFechainicio()
				, getFechafin()
				, getEstado()
				, this.tipo.getView()
				, this.cliente.getView()
				, estaActiva()
				, this.auto.getView()); 
		return 	res;	
	}
	private void chequearVigencia()
	{
		if (this.estaActiva())
		{
			Date d = new Date();
			
			if (this.fechainicio.after(d))
			{
				int dias = 0; 
	
		        long milisFI = this.fechainicio.getTime();
		        long milisFF = this.fechafin.getTime();
		
		        long diff = milisFF - milisFI;
		        dias = (int)diff / (24 * 60 * 60 * 1000);		        
		        
				if(dias<1)
				{
					this.estado = "Cancelado x NC";
				}
			}
		}
	}
}
